#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MUD客户端主程序模块
负责协调网络、协议和UI组件之间的交互
实现命令解析和处理逻辑
管理客户端整体运行状态
"""

import asyncio
import logging
from .ui.main_window import MainWindow
from .network.session import MUDSession
from .utils.command_handler import CommandHandler
from .utils.ui_logging import set_ui_instance

logger = logging.getLogger(__name__)  # UI日志

class MUDClient:
    """
    MUD客户端主类（外观模式+组合模式）
    作为系统的外观层，对外提供简化的接口，对内协调UI、网络等子系统的复杂操作
    """
    
    def __init__(self):
        """
        初始化各子系统
        """
        # 网络模块
        self.session = None  # 会话管理
        
        # UI模块
        self.ui = MainWindow()  # 主界面
        
        set_ui_instance(self.ui)
        
        # 命令处理模块
        self.command_handler = CommandHandler(self)
                
        # 组合模式配置
        self._setup_components()
        
        logger.info("MUD客户端初始化完成")
    
    def _setup_components(self):
        """
        组合模式配置各组件关系
        """
        # 设置UI回调
        self.ui.set_input_callback(self.command_handler.handle_input_command)
        
        # 设置会话回调
        # self.session.set_data_callback(self.ui.append_game_output)
    
    async def run(self):
        """
        运行客户端主循环
        """
        await self.ui.run_async()
    
    def stop(self):
        """
        停止客户端运行
        """
        self.ui.exit()
        logger.info("MUD客户端已停止")
    
    async def connect(self, host: str, port: int, encoding: str = "utf-8", client_type: str = "default"):
        """
        外观方法：建立连接
        
        Args:
            host (str): 服务器主机名
            port (int): 服务器端口号
            encoding (str): 字符编码，默认为utf-8
            client_type (str): 客户端类型，默认为'default'
        """
        logger.info(f"正在连接到 {host}:{port} (编码: {encoding}, 客户端类型: {client_type})")
        
        # 创建会话，支持指定客户端类型
        self.session = MUDSession(host, port, encoding, client_type)
        
        # 连接服务器
        success = await self.session.connect()
        if success:
            logger.info(f"成功连接到 {host}:{port}")
            self.ui.set_status(f"已连接 {host}:{port}")
            
            # 启动数据接收任务
            self._run_receive_loop()
        else:
            logger.error(f"连接到 {host}:{port} 失败")
            self.ui.set_status("连接失败")
    
    async def send_command(self, command: str):
        """
        外观方法：发送命令
        
        数据流处理规范：
        1. UI捕获输入：UI层捕获用户输入并通过回调传递给CommandHandler
        2. 命令处理：CommandHandler解析命令并调用MUDClient的send_command()方法
        3. 客户端转发：MUDClient调用Session的send_data()方法发送数据
        
        Args:
            command (str): 要发送的命令
        """
        if self.session:
            await self.session.send_data(command)
        else:
            logger.warning("未连接到服务器，无法发送命令")
    
    async def disconnect(self):
        """
        外观方法：断开连接
        """
        if self.session:
            await self.session.disconnect()
            self.session = None
            self.ui.set_status("已断开连接")
            logger.info("连接已断开")
    
    def _run_receive_loop(self):
        """
        运行数据接收循环
        """
        async def receive_loop():
            try:
                while self.session and self.session.connected:
                    # 从服务器读取数据
                    data = await self.session.receive_data()
                    if data:
                        # 将接收到的数据显示在游戏输出窗口中
                        self.ui.append_game_output(data)
                    
                    # 短暂休眠以避免过度占用CPU
                    await asyncio.sleep(0.01)
                    
            except Exception as e:
                logger.error(f"接收数据时发生错误: {e}")
                await self.disconnect()
        
        # 启动接收循环任务
        asyncio.create_task(receive_loop())
